package co.edu.uniandes.moviles.rollerjudge.logica;

import java.util.ArrayList;
import java.util.Date;

public class RollerJudge {

	public final static boolean PRUEBA_GRUPAL = false;

	public final static boolean PRUEBA_INDIVIDUAL = true;

	private static RollerJudge instancia;

	private ArrayList<Torneo> torneos;

	private ArrayList<Equipo> equipos;

	private ArrayList<Deportista> patinadores;

	private PruebaIndividual pruebaIndividualActiva;

	private PruebaGrupal pruebaGrupalActiva;

	private PruebaIndividual pruebaIndividualUltima;

	private PruebaGrupal pruebaGrupalUltima;

	/**
	 * @return the pruebaIndividualActiva
	 */
	public PruebaIndividual getPruebaIndividualActiva() {
		return pruebaIndividualActiva;
	}

	/**
	 * @param pruebaIndividualActiva the pruebaIndividualActiva to set
	 */
	public void setPruebaIndividualActiva(Torneo tor, String genero, int distancia, int min, int max) {
		this.pruebaIndividualActiva = tor.buscarPruebaIndividual(genero, distancia, max, min);
	}

	/**
	 * @return the pruebaGrupalActiva
	 */
	public PruebaGrupal getPruebaGrupalActiva() {
		return pruebaGrupalActiva;
	}

	public void finalizarPrueba()
	{
		if(pruebaGrupalActiva!=null)
		{
			
			pruebaGrupalUltima = pruebaGrupalActiva;
			pruebaGrupalActiva=null;
		}
		else
		{
			pruebaIndividualUltima= pruebaIndividualActiva;
			pruebaIndividualActiva=null;
		}
	}

	public void realizarRegistro(String depor, String tipo)throws Exception
	{
		if(pruebaGrupalActiva!=null)
		{
			realizarRegistroGrupo(depor, tipo);
		}
		else
		{
			realizarRegistroIndi(depor, tipo);
		}
	}

	public String resumenPrueba()
	{
		
		if(pruebaGrupalUltima!=null)
		{
			return pruebaGrupalUltima.resumen();
		}
		else if(pruebaIndividualUltima!=null)
		{
			return pruebaIndividualUltima.resumen();
			
		}
		else{
			return "No se han realizado pruebas";
		}
	}

	public void realizarRegistroGrupo(String grupo, String tipo) throws Exception
	{
		Equipo equ = buscarEquipoPorNombre(grupo);
		Date fecha= new Date();
		Registro re = new Registro(null, equ, tipo, fecha);
		pruebaGrupalActiva.agregarRegistro(re);
	}

	public void realizarRegistroIndi(String deport, String tipo) throws Exception
	{
		Deportista depor = darDeportista(deport);
		Date fecha= new Date();
		Registro re = new Registro(depor, null, tipo, fecha);
		pruebaIndividualActiva.agregarRegistro(re);
	}

	/**
	 * @param pruebaGrupalActiva the pruebaGrupalActiva to set
	 */
	public void setPruebaGrupalActiva(Torneo tor, String genero,int distancia) {
		pruebaGrupalActiva = tor.buscarPruebaGrupal(genero, distancia);
	}





	public RollerJudge() {
		super();
		torneos = new ArrayList<Torneo>();
		equipos = new ArrayList<Equipo>();
		patinadores = new ArrayList<Deportista>();
	}

	public static RollerJudge darInstancia() {
		if(instancia == null) {
			instancia = new RollerJudge();
		}
		return instancia;
	}

	public void crearTorneo(String nombre, Date fecha, int edadMinima, int edadMaxima, String lugar) throws Exception {
		Torneo torneo = new Torneo(nombre, fecha, edadMinima, edadMaxima, lugar);
		boolean encontro= false;
		for(int i=0;i<torneos.size()&& !encontro;i++)
		{
			if(torneos.get(i).getNombre().equals(torneo.getNombre()) && torneo.getFecha().equals(fecha))
				encontro=true;
		}
		if(!encontro)
		{
			torneos.add(torneo);
		}
		else
			throw new Exception("Ya existe un torneo con ese nombre para esta fecha");
	}

	public void registrarEquipo(String nombreEquipo, String nombreRepresentante, String telefono, String correo) throws Exception {
		Equipo equipo = new Equipo(nombreEquipo, nombreRepresentante, telefono, correo);
		boolean encontro= false;
		for(int i=0;i<equipos.size()&& !encontro;i++)
		{
			if(equipos.get(i).getNombre().equals(equipo.getNombre()))
				encontro=true;
		}
		if(!encontro)
		{
			equipos.add(equipo);
		}
		else
			throw new Exception("Ya existe un Equipo con ese nombre.");
	}

	public void registrarPatinador(String nombre, String documento, int numero, String email, int edad, String genero, String nombreEquipo) throws Exception {
		Equipo equipo = buscarEquipoPorNombre(nombreEquipo);
		Deportista patinador = new Deportista(nombre, documento, numero, email, edad, genero, equipo);
		boolean encontro= false;
		for(int i=0;i<patinadores.size()&& !encontro;i++)
		{
			if(patinadores.get(i).getDocumento().equals(patinador.getDocumento()))
				encontro=true;
		}
		if(!encontro)
		{
			patinadores.add(patinador);
			equipo.registrarPatinador(patinador);
		}
		else
			throw new Exception("Ya existe un patinador con ese documento.");
	}

	@SuppressWarnings("unchecked")
	public void crearPruebaGrupal(Torneo torneo, String genero, int edadMinima, int edadMaxima, int distancia, Object inscritos){

		ArrayList<Equipo> equipos = (ArrayList<Equipo>) inscritos;
		PruebaGrupal prueba = new PruebaGrupal(equipos, genero, edadMinima, edadMaxima,distancia);
		torneo.registrarPruebaGrupal(prueba);

	}

	public void crearPruebaIndividual(Torneo torneo, String genero, int edadMinima, int edadMaxima, int distancia, ArrayList<String> inscritos){


		PruebaIndividual prueba = new PruebaIndividual(inscritos(inscritos), genero, edadMinima, edadMaxima,distancia);
		torneo.registrarPruebaIndividual(prueba);

	}

	public ArrayList<Deportista> inscritos( ArrayList<String> nombres)
	{
		ArrayList<Deportista> res = new  ArrayList<Deportista>();
		for(int i= 0;i<nombres.size();i++)
		{
			res.add(darDeportista(nombres.get(i)));
		}
		return res;
	}
	public Deportista darDeportista (String nombre)
	{
		Deportista res =null;

		for(int i=0;i<patinadores.size();i++)
		{
			if(patinadores.get(i).getNombre().equals(nombre))
				return patinadores.get(i);
		}
		return res;
	}

	public Torneo darTorneo(String nombre)
	{
		Torneo res=null;
		for(int i=0;i<torneos.size();i++)
		{
			if(torneos.get(i).getNombre().equals(nombre))
				return torneos.get(i);
		}
		return res;
	}
	//TODO
	public void iniciarPruebaIndividual(Torneo torneo, PruebaIndividual prueba) throws Exception{
		if(pruebaGrupalActiva!=null || pruebaIndividualActiva!=null){
			throw new Exception("No se puede iniciar la prueba porque hay otra en curso.");
		}
		else{
			pruebaIndividualActiva = prueba;
			pruebaIndividualActiva.iniciarPrueba();
		}
	}

	public void iniciarPruebaGrupal(Torneo torneo, PruebaGrupal prueba) throws Exception{
		if(pruebaGrupalActiva!=null || pruebaIndividualActiva!=null){
			throw new Exception("No se puede iniciar la prueba porque hay otra en curso.");
		}
		else{
			pruebaGrupalActiva = prueba;
			pruebaGrupalActiva.iniciarPrueba();
		}

	}

	//TODO



	public Equipo buscarEquipoPorNombre(String nombreEquipo) {
		for (Equipo equipo : equipos) {
			if(equipo.getNombre().equals(nombreEquipo)){
				return equipo;
			}
		}
		return null;
	}

	public void retirarEquipoDeTorneo(Torneo torneo, Equipo selected) {
		torneo.retirarEquipo(selected);
	}

	public void inscribirEquipoATorneo(Torneo torneo, Equipo selected) {
		torneo.inscribirEquipo(selected);
	}

	public ArrayList<Torneo> darTorneos() {
		return torneos;
	}

	public ArrayList<Equipo> darEquipos() {
		return equipos;
	}

	public ArrayList<Deportista> darPatinadores() {
		return patinadores;
	}



	public boolean hayPruebas()
	{
		boolean res = false;
		for(int i = 0; i<torneos.size();i++)
		{
			if(torneos.get(i).getPruebasIndividuales().size()!=0 || torneos.get(i).getPruebasGrupales().size()!=0)
			{
				return true;
			}
		}

		return false;
	}

	public String estadiPatinador(String nombre)
	{
		int pruebasCom=0;
		int ganadas=0;
		int faltas =0;
		int eliminacion=0;
		
		String res ="";
		for(int i=0;i<torneos.size();i++)
		{
			ArrayList<PruebaIndividual> pruebas = torneos.get(i).getPruebasIndividuales();
			for(int j=0;j<pruebas.size();j++)
			{
				PruebaIndividual pru= pruebas.get(i);
				ArrayList<Deportista> deportistas= pru.getParticipantes();
				boolean encontro = false;
				for(int k=0;k<deportistas.size()&& !encontro;k++)
				{
					if(deportistas.get(k).getNombre().equals(nombre))
					{
						encontro=true;
						pruebasCom++;
					}
				}
				ArrayList<Registro> registros = pru.getRegistros();
				for(int l=0;l<registros.size();l++)
				{
					Registro re = registros.get(l);
					if(re.getPatinador()!=null && re.getPatinador().getNombre().equals(nombre))
					{
						if(re.getTipo().equals("FALTA"))
						{
							faltas++;
						}
						else if(re.getTipo().equals("ELIMINACION"))
						{
							eliminacion++;
						}
					}
				}
				Deportista temp = pru.getListaLlegada().get(i);
				if(temp.getNombre().equals(nombre))
				{
					ganadas++;
				}
				
			}
		}
		res="Pruebas competidas: "+ pruebasCom+"\n Pruebas Ganadas: "+ ganadas+"\n Faltas:" + faltas+ "\n Eliminaciones:" + eliminacion;		
		return res;
	}

	public String estadiGrupo(String nombre)
	{
		int pruebasCom=0;
		int ganadas=0;
		int faltas =0;
		int eliminacion=0;
		
		String res ="";
		for(int i=0;i<torneos.size();i++)
		{
			ArrayList<PruebaGrupal> pruebas = torneos.get(i).getPruebasGrupales();
			for(int j=0;j<pruebas.size();j++)
			{
				PruebaGrupal pru= pruebas.get(i);
				ArrayList<Equipo> deportistas= pru.getParticipantes();
				boolean encontro = false;
				for(int k=0;k<deportistas.size()&& !encontro;k++)
				{
					if(deportistas.get(k).getNombre().equals(nombre))
					{
						encontro=true;
						pruebasCom++;
					}
				}
				ArrayList<Registro> registros = pru.getRegistros();
				for(int l=0;l<registros.size();l++)
				{
					Registro re = registros.get(l);
					if(re.getEquipo()!=null && re.getEquipo().getNombre().equals(nombre))
					{
						if(re.getTipo().equals("FALTA"))
						{
							faltas++;
						}
						else if(re.getTipo().equals("ELIMINACION"))
						{
							eliminacion++;
						}
					}
				}
				Equipo temp = pru.getListaLlegada().get(i);
				if(temp.getNombre().equals(nombre))
				{
					ganadas++;
				}
				
			}
		}
		res="Pruebas competidas: "+ pruebasCom+"\n Pruebas Ganadas: "+ ganadas+"\n Faltas:" + faltas+ "\n Eliminaciones:" + eliminacion;		
		return res;
		
	}



}
